var express = require('express');
var app = express();
var fs = require('fs');
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var util = require('util');

// 解析 application/x-www-form-urlencoded编码解析
var urlencodedParser = bodyParser.urlencoded({ extended: false })

// 这里的是静态文件的路径，使得前端可以通过 http://localhost:8081/public/index.html 访问到public中的东西
app.use('/public', express.static('public'));

app.get('/index.html', function (req, res) {
    res.sendFile( __dirname + "/" + "index.html" );
})

app.get('/process_get',function (req, res){
    const firstName = decodeURIComponent(req.query.first_name || '');
    const lastName = decodeURIComponent(req.query.last_name || '');

    console.log('First Name:', firstName);
    console.log('Last Name:', lastName);

    var response = {
        first_name: firstName,
        last_name: lastName
    };

    console.log(response);
    // res.json(response);
    res.end(JSON.stringify(response));
})

app.post('/process_post', urlencodedParser, function (req, res) {

    // 输出 JSON 格式
    var response = {
        "first_name":req.body.first_name,
        "last_name":req.body.last_name
    };
    console.log(response);
    //这里的end是原生的方式的返回方式
    // res.setHeader('Content-Type', 'application/json; charset=utf-8');
    // res.end(JSON.stringify(response));
    res.json(response);
})

//---------------------------------------上面的是get和post请求的代码------------------------------------------

//获取cookie的操作
app.use(cookieParser());
app.get('/cookie', function (req, res) {
    console.log(req.cookies);
    console.log(util.inspect(req.cookies));
})

//--------------------------------上面的是cookie的操作-------------------------
//multer 是 Express 的中间件，用于处理 multipart/form-data 类型的请求（即文件上传）。
const multer  = require('multer');
const path = require("path");
const iconv = require('iconv-lite');
app.use(urlencodedParser);
//⚠️ 全局注册 multer 不推荐，这会让所有请求都尝试解析上传数据，即使不需要上传文件的接口也会受到影响。
// app.use(multer({ dest: '/tmp/'}).array('image'));
const upload = multer({ dest: '/tmp/' }).array('image');

//文件上传的处理操作
app.post('/file_upload', function (req, res) {


    upload(req, res, function (err) {
        if (err) {
            return res.status(400).json({ error: "Upload failed", message: err.message });
        }

        if (!req.files || req.files.length === 0) {
            return res.status(400).json({ error: "No file uploaded" });
        }

        console.log(req.files[0]);  // 上传的文件信息

        // var des_file = __dirname + "/" + req.files[0].originalname;
        //安全一些的操作，防止外部替换私密的内部的文件，如：../../etc/passwd
        const path = require('path');
        // const originalName = path.basename(req.files[0].originalname); // 安全获取文件名，但还是有编码问题，这里的是不进行编码的处理的
        //这个文件名在 HTTP 请求中是以 UTF-8 编码的字节序列 发送的。
        // 但 Express/Multer 默认情况下没有帮你进行解码，而是直接将其当作字符串处理
        // const originalName = decodeURIComponent(path.basename(req.files[0].originalname));

        //进行可能的乱码问题的防范
        function decodeFilename(filename) {
            try {
                // 先尝试标准 URL 解码（适用于 UTF-8）
                return decodeURIComponent(escape(filename));
            } catch (e) {
                // 如果失败，说明可能是 ISO-8859-1 或 GBK 编码
                let buffer = Buffer.from(filename, 'binary');
                // 尝试判断是 UTF-8 还是 GBK
                try {
                    // 先尝试 UTF-8
                    return buffer.toString('utf8');
                } catch (utf8Err) {
                    // 失败则尝试 GBK
                    return iconv.decode(buffer, 'gbk');
                }
            }
        }

        // 使用示例
        const originalName = decodeFilename(path.basename(req.files[0].originalname));

        const des_file = path.join(__dirname, originalName);
        console.log(des_file);
        let response;
        fs.readFile( req.files[0].path, function (err, data) {
            fs.writeFile(des_file, data, function (err) {
                if( err ){
                    console.log( err );
                }else{
                    response = {
                        message:'File uploaded successfully',
                        filename:originalName
                    };
                }
                console.log( response );
                // res.end( JSON.stringify( response ) );
                res.json(response);
            });
        });
    });
})
//-----------------------------------------上面是文件上传的处理操作--------------------------------------------------
app.get('/listUsers', function (req, res) {
    fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
        console.log( data );
        res.end( data );
    });
})

//添加的新用户数据
var user = {
    "user4" : {
        "name" : "mohit",
        "password" : "password4",
        "profession" : "teacher",
        "id": 4
    }
}

app.get('/addUser', function (req, res) {
    // 读取已存在的数据
    fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
        data = JSON.parse( data );  // 把字符串解析为JSON对象。
        data["user4"] = user["user4"];
        console.log( data );
        res.end( JSON.stringify(data));  //这里的是对数据进行JSON格式化，然后返回给客户端。
    });
})

//定义了一个路由参数，表示该位置的 URL 值将被映射到 req.params.id
//这里的路由会匹配只有一个/的路由，使得放在后面的路由会匹配失败
app.get('/:id', function (req, res) {
    // 首先我们读取已存在的用户
    fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
        data = JSON.parse( data );
        var user = data["user" + req.params.id]
        // var user2 = data["user2"]["id"]
        // console.log( user2 )
        // console.log( req );
        // console.log( req.params)
        console.log( user );
        res.end( JSON.stringify(user));
    });
})

app.get('/deleteUser/:id', function (req, res) {

    // First read existing users.
    fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
        data = JSON.parse( data );
        delete data["user" + req.params.id];

        console.log( data );
        res.end( JSON.stringify(data));
    });
})




var server = app.listen(8081, function () {

    var host = server.address().address
    var port = server.address().port

    console.log(`应用实例，访问地址为 http://${host}:${port}`)

})